package com.it.reggie.Controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.it.reggie.Service.UserService;
import com.it.reggie.Utils.ValidateCodeUtils;
import com.it.reggie.common.R;
import com.it.reggie.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Resource
    private JavaMailSender javaMailSender; //我们需要用这个进行邮件发送

    @Value("${spring.mail.username}")  //注入yml文件资源
    private String from;

    @PostMapping("/sendMsg")
    public R<String> SendMsg(@RequestBody User user, HttpSession session) {

        //使用qq邮箱发送验证码
        //获取前端提交过来的qq邮箱
        String phone = user.getPhone(); //原本是手机号发送验证码 这里改为邮箱

        //判断 ! null
        if (StringUtils.isNotBlank(phone)){
            //使用工具类创建验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("验证码 {}" ,code);

            //构建邮箱对象
            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();

            //设置发送者
            simpleMailMessage.setFrom(from); //from 从yml配置文件 注入

            //设置邮件接收者
            simpleMailMessage.setTo(phone);

            //设置有纪念意义的主题
            simpleMailMessage.setSubject("登录验证码");

            //设置邮件的征文
            String text = "工学一体 （长岭） 验证码为：" +code +"请勿泄露";
            simpleMailMessage.setText(text);


            //将生成的验证码保存在Session
                //将我们生成的手机号（邮箱）和验证码放在Session里面，我们后面用户填入验证码，我们验证的时候就从这里去取然后进行比对
            //这里我们需要一个异常捕获
            session.setAttribute(phone,code);

            try {
                javaMailSender.send(simpleMailMessage);
                return R.success("验证码发送成功");
            } catch (MailException e) {
                e.printStackTrace();
            }


        }

        return R.error("验证码发送失败");
    }

    @PostMapping("/login")
    public R<User> login (@RequestBody Map map ,HttpSession session){

        log.info("map {}",map);

        //        使用map来接收参数,接收键值参数、
        //        编写处理逻辑
        //        获取到手机号
        //        获取到验证码
        //        从Session中获取到保存的验证码
        //        将session中获取到的验证码和前端提交过来的验证码进行比较，这样就可以实现一个验证的方式
        //        比对页面提交的验证码和session中
        //        判断当前的手机号在数据库查询是否有记录，如果没有记录，说明是一个新的用户，然后自动将这个手机号进行注册

            //获取当前登录的 邮箱 和输入的验证码
        String phone = map.get("phone").toString();
        String code = map.get("code").toString();


            //获取session中 phone字段对应的验证码
        Object codeInsession = session.getAttribute(phone); //获取验证码

        if (codeInsession != null && codeInsession.equals(code)) { //判断验证码不等于空 且 判断是否和输入验证码一致
            //进入判断 验证码正确

            LambdaQueryWrapper<User> LambdaQueryWrapper = new LambdaQueryWrapper<>();
            //查询表是否存在 当前用户
            LambdaQueryWrapper.eq(User::getPhone,phone);
            User User = userService.getOne(LambdaQueryWrapper);

            if (User == null) {
                User user = new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);
                log.info("user {}",user);
                session.setAttribute("user",user.getId());
                return R.success(user);
            }
            //这里我们将user存储进去，后面各项操作，我们会用，其中拦截器那边会判断用户是否登录，所以我们将这个存储进去,
            session.setAttribute("user",User.getId());
            return R.success(User);

        }

        return R.error("验证失败");

    }

}
